package com.xmg.boot.demo.bootcommon.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.Map;

/**
 * @author: ma
 * @date: 2023-12-05
 * @since: JWT - 帮助类
 */
public class JwtUtils {

    //yml配置文件，读取Jwt相关配置信息
    //需要转成静态属性，否则无法应用在方法中
    // @Value("${jwt.expireTime}")
    // private Long expireTime;
    // @Value("${jwt.secret}")
    // private String secret;
    // @Value("${jwt.issuer}")
    // private String issuer;
    //
    // public static Long ExpireTime;
    // public static String Secret;
    // public static String Issuer;
    //
    // public static Long getExpireTime() {
    //     return ExpireTime;
    // }
    //
    // public static String getSecret() {
    //     return Secret;
    // }
    //
    // public static String getIssuer() {
    //     return Issuer;
    // }
    //
    // @PostConstruct
    // public void getApiToken(){
    //     ExpireTime=this.expireTime;
    //     Secret=this.secret;
    //     Issuer=this.issuer;
    // }

    private static final String issuer="issuer";
    private static final Long expireTime= 1000*60*60L;
    private static final String secret="secret";

    /**
     * @description: 生成token
     * @author: ma
     * @date: 2023/12/5
     **/
    public static String sign(Map<String,String> map){
        JWTCreator.Builder builder = JWT.create();
        // 发行人
        //builder.withIssuer(jwtModule.getIssuer());
        // 过期时间
        //builder.withExpiresAt(new Date(System.currentTimeMillis()+ jwtModule.getExpireTime()));

        builder.withIssuer(issuer);
        // 过期时间
        builder.withExpiresAt(new Date(System.currentTimeMillis()+ expireTime));
        // 存放数据
        map.forEach(builder::withClaim);
        return builder.sign(Algorithm.HMAC256(secret));
    }


    /**
     * @description: token验证
     * @author: ma
     * @date: 2023/12/5
     **/
    public static void verify(String token){
       //
            //创建token验证器
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).withIssuer(issuer).build();
            jwtVerifier.verify(token);
        // } catch (IllegalArgumentException | JWTVerificationException e){
        //     //抛出错误即为验证不通过
        //     return false;
        // }
        // return true;
    }

    /**
     * @description: 获取有效荷载
     * @author: ma
     * @date: 2023/12/5
     **/
    public static DecodedJWT getPayload(String token){
        DecodedJWT decodedJWT=JWT.require(Algorithm.HMAC256(secret)).build().verify(token);
        // 用户名
      //  System.out.println(decodedJWT.getClaim("userName"));
        // 过期时间
        // System.out.println(decodedJWT.getExpiresAt());
        return decodedJWT;
    }


}
